6
Кнопки и флажки
Поговорим о кнопках-переключателях и флажках. Эти элементы не такие сложные, как предыдущие, но и они имеют ряд особенностей. Кнопки-переключатели дают пользователю возможность выбора некоторого элемента во взаимоисключающем режиме.
Очевидно, что: 1) если в кружке кнопки-переключателя Option Button есть черная точка, то пункт считается выбранным, иначе - нет; 2) нельзя выбрать более одного пункта. Кстати, если программисту необходимо, чтобы пользователь мог выбирать на одной форме несколько пунктов из кнопок-переключателей, то наборы таких кнопок необходимо помещать в рамки - элемент Frame.
Свойства элемента Option Button (кнопка-переключатель): 1) Name - имя кнопки.
2) Alignment - определяет расположение надписи около кнопки (слева, справа).
3) Appearance - определяет стиль кнопки (цветная, объемная).
4) Value - логическое свойство, определяющее факт выбора кнопки.
Замечание. Кнопки-переключатели служат для того, чтобы пользователь делал выбор между двумя (или более) вариантами. И тут возникает проблема: как отслеживать факт выбора пользователем того или иного пункта? Это можно делать двумя способами:
1) Напрямую, т.е. "прокликивать" каждую кнопку и прописывать процедуру "кликнули именно на этом пункте":
Private Sub Option1_Click()
Option1.Value = True
End Sub
Private Sub Option2_Click()
Option2.Value = True
End Sub
Так придется делать для каждой кнопки на форме (или в рамке), чтобы потом (после того, как пользователь кликнет на кнопке "ОК" или "Дальше") анализировать, какая именно кнопка имеет выбранное значение, т.е. ее свойство Value=True. (Нам нет нужды заботиться, чтобы при выборе второй кнопки первая "сбросилась" - за этим бдительно следит Windows.)
2) Через массив элементов, т.е. поместить на форму (или в рамку) одну кнопку и, сделав массив кнопок-переключателей, прописать для них одну процедуру, имеющую параметр - индекс:
Private Sub Option1_Click(Index As Integer)
Option1(Index).Value = True
End Sub
Нам совершенно неинтересно, что: многие из вас не помнят о том, что такое "массив элементов". См. лекцию №4 "Массивы".
Поговорим о флажках. Эти элементы управления, в отличие от кнопок-переключателей, имеют три состояния свойства Value: 1) 0-Unchecked - элемент не отмечен; 2) 1-Checked - элемент отмечен; 3) 2-Grayed - элемент недоступен.
Свойства элемента CheckBox ("флажок"): Практически такие же, как и у Option Button.
Большой пример. Организуем прием данных от пользователя, используя кнопки-переключатели и флажки. Допустим, что мы хотим зарегистрировать пользователя и вывести в метку данные о нем и нашей программе. Пусть мы собираем данные с помощью трех форм:
Первая форма имеет имя Form1, на ней расположены два текстовых окна Text1, Text2, две метки, поясняющие назначение этих окон и командная кнопка Command1 с надписью "Далее >>". На этой форме пользователь должен ввести свое имя, название своей организации и кликнуть на кнопке. В задачу программиста входит отслеживание того, чтобы пользователь не оставил текстовые окна пустыми.
Вторая форма имеет имя Form2, на ней расположены две кнопки Command1 ("<< Назад"), Command2 ("Далее >>"), метка, рамка и две радио-кнопки (кнопки-переключатели) Option1, Option2. В задачу этой формы входит: 1) принять от пользователя информацию о условиях (принимает, не принимает); 2) перейти на следующую или предыдущую форму.
Третья форма имеет имя Form3, на ней расположены кнопки Command1, Command2, рамка, а также массив флажков Check1[0..3]. В задачу этой формы входит: 1) обеспечить выбор элементов, указанных в рамке (элемент отмечен или не отмечен); 2) перейти на следующую или предыдущую форму. После того, как пользователь ввел все данные, необходимые нам, остается вывести для него сообщение на четвертой форме Form4 о том, зарегистрирован он или нет. Это будет определяться тем, что он: 1) указал все данные во всех трех формах; 2) принял условия лицензионного соглашения.
Теперь пришло время заняться программированием. Наше приложение состоит из четырех форм и одного файла-модуля, в котором мы будем определять публичные переменные. Помните, мы говорили о том, что если мы хотим, чтобы переменная с одной формы была доступна другой форме, то такая переменная должна быть объявлена как публичная?
![]()
![]()
![]()
Так как наши формы будут "умирать" после того, как с ними поработает пользователь, то переменные, объявленные в них (глобальные, статические и пр.) также "умрут". Поэтому, для публичных переменных мы подключим специальный файл, т.н. "модуль", в котором определим все необходимые нам переменные и будем инициализировать их на соответствующих формах. (Хоть что-то понятно?)
Замечание. В качестве абстрактного примера представьте себе залитый солнцем порт, в котором большой кран грузит на белый как сахар пароход ящики с фруктами. Рабочий, цепляющий ящики, внимательно смотрит на борт каждого и кричит бригадиру что-то примерно: "Абрам, ящик номер два - бананы, 200 тонн". Бригадир записывает данные в блокнот и лениво машет рукой: "Грузи…" Так вот: ящики - это формы; бананы и тонны - это данные; а блокнот Абрама - это модуль. Скоро пароход уйдет, но у Абрама останутся данные, т.к. они определены в модуле... Таким образом, код программы состоит из пяти частей:
Public username As String Public userorg As String Public flag As Boolean Public userprog As String
Dim i As Integer 'вспомогательная переменная Rem Далее, с Формы 1 на Форму 2 Private Sub Command1_Click() If Text1 <> "" And Text2 <> "" Then username = Text1 userorg = Text2 Form2.Show 'Форма 2 стала видна Unload Form1 'Форма 1 выгрузилась Else i = MsgBox("Необходимо вести имя и организацию", vbCritical, "Form1") End If End Sub
Rem Назад, с Формы 2 на Форму 1 Private Sub Command1_Click() Form1.Show 'Форма 1 стала видна Unload Form2 'форма 2 выгрузилась End Sub Rem Далее, с Формы 2 на Форму 3 Private Sub Command2_Click() Form3.Show 'Форма 3 стала видна Unload Form2 'Форма 2 выгрузилась End Sub Rem Условие принято Private Sub Option1_Click() flag = True End Sub Rem условие не принято Private Sub Option2_Click() flag = False End Sub
Dim i As Integer Rem Назад, с Формы 3 на Форму 2 Private Sub Command1_Click() Form2.Show Unload Form2 End Sub Rem Далее, с Формы 3 на Форму 4 Private Sub Command2_Click() userprog = "На вашем компьютере установлены программы:" & Chr(10) & Chr(13) For i = 0 To 3 If Check1(i).Value = 1 Then userprog = userprog & "-" & Check1(i).Caption & Chr(10) & Chr(13) Next i Form4.Show Unload Form3 End Sub
Rem Выход из программы Private Sub Command1_Click() End End Sub Rem При загрузке формы метка набивается данными Private Sub Form_Activate() If flag = True Then Label1 = Label1 & Chr(10) & Chr(13) & Chr(10) & Chr(13) Label1 = Label1&"Пользователь-"&username&Chr(10)&Chr(13)&Chr(10)&Chr(13) Label1 = Label1&"Организация-"&userorg&Chr(10)&Chr(13)&Chr(10)&Chr(13) Label1 = Label1 & "Вы приняли условие нашего лицензионного соглашения и поэтому вы являетесь зарегистрированным пользователем" & Chr(10) & Chr(13) Else Label1 = "К сожалению, наша компания не будет сотрудничать с вами, так как вы не приняли условия лицензионного соглашения" End If End SubЗамечание по Module1. Чтобы добавить в проект модуль, необходимо выбрать пункты меню Project | Add Module. В модуле мы определяем публичные переменные username (имя пользователя), userorg (организация пользователя), flag (логическая переменная, указывающая на согласие или несогласие пользователя с условиями соглашения) и userprog (строковая переменная, в которую мы будем набивать те программы, которые пользователь отметит галочками на третьей форме).
Замечание по Form1. На первой форме только одна процедура - Command1_Click(), т.е. кликнули на кнопке "Далее >>". В ней происходит проверка на то, что оба текстовых окна не пусты: если это так, то пришло время проинициализировать переменные username, userorg, загрузить вторую форму и выгрузить первую. Если текстовые окна пусты, то надо сказать пользователю об этом и продолжить вводить данные на первой форме.
Замечание по Form2. На второй форме две процедуры отвечают за перемещение по формам (следующая, предыдущая) и две процедуры, отвечающие за установку переменной flag.
Замечание по Form3. На третьей форме две процедуры отвечают за перемещение по формам, причем процедура "Вперед" выполняет еще одну роль: в ней в строковую переменную userprog набиваются те программы, которые отметил пользователь. Так как флажки (Check1) представляют собой массив элементов, то сделать это можно в цикле (от 0 до 3), в котором к строке "На вашем компьютере установлены программы" добавляются строки (Chek1[index].Caption), если у этого Check1[index].Value=1, т.е. элемент отмечен. Для красоты строки используются управляющие символы chr(10), chr(13) - клавиша Enter - и символ "-" (тире).
Замечание по Form4. На четвертой форме в процедуре активации формы происходит проверка того, согласился ли пользователь с условием: если да, то все данные, которые он ввел, объединяются для вывода; в противном случае - высказывается сожаление. При построении строки используется сочетание chr(10) & chr(13) по два раза - это сделано для того, чтобы строка имела удобочитаемый вид. Например, такой:
Нам совершенно неинтересно, что: мы так и не использовали строку userprog (строку с программами, которые установлены у пользователя). При желании вы можете сделать это самостоятельно.
Задания по лабораторной работе 6
1. Прочитать и законспектировать работу, проверить пример.
2. Разобрать два дополнительных примера (только для тех, у кого есть пособие и дискета с дополнительными примерами).
3. Выбрать любое отчетное задание: "создать программу, в которой..."
1 все данные, введенные пользователем, записываются в файл reg.txt (вместе с данными о том, какие программы у пользователя уже установлены); 2 можно обрабатывать строку текста, введенную пользователем - кнопками-переключателями должно отмечаться состояние строки (обычный, жирный, курсивный шрифт, цвет фона, цвет текста, все буквы большие, все буквы маленькие); 3 можно ввести число и обработать его одной из функций, список которых помещен в рамке в виде кнопок-переключателей - sin, cos, tg, ln, sqrt; 4 реализована игра "Орел или решка": компьютер загадывает число, пользователь указывает с помощью кнопок-переключателей "орел" или "решка" и жмет кнопку "игра" - если пользователь угадал, то его ставка увеличивается вдвое, если нет, то ставка теряется.d> 5*** Сделать программу, которая позволит преподавателю отмечать галочками те лабораторные работы, которые сделаны студентом. Список студентов поместить в меню, а возможность модификации отчетов предусмотреть только для преподавателя, т.е. завести пароль на вход в программу. Вход без пароля должен блокировать возможность модификации. См. примерный вариант формы: